<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width initial-scale=1">
  <script src="js/marked.min.js"></script>
  <link rel="stylesheet" href="css/github-markdown.css">
  <style>
@media (max-width: 767px) { body { padding: 15px; } }
body { box-sizing: border-box;
       min-width: 200px;
       max-width: 980px;
       margin: 0 auto;
       padding: 45px; }
  </style>
  <title>Marked.js</title>
</head>
<body>
  <div id="$m" class="markdown-body"></div>
  <textarea id="$t" style="">
    #### 功能

    selenium是一套完整的web应用程序测试系统，包含测试录制，编写，运行，及测试的并行处理。
    
    selenium的核心selenium core基于JsUnit，完全由JavaScript编写，因此可用于任何支持JavaScript的浏览器上。
    
    可模拟真实浏览器，自动化测试工具，支持多种浏览器。爬虫中主要用来解决JavaScript渲染问题。
    
    #### 基本使用
    
    爬虫中，主要用selenium的webdriver。
    
    ```
    help(webdriver)--可查看支持的浏览器
    ```
    
    ##### PhantomJs
    
    基于webkit的服务端JavaScript api，支持web而不需要浏览器支持。快速，原生支持各种web标准：Dom处理，CSS选择器，JSON等等。PhantomJS可用于页面自动化，网络监测，网页截屏，及无界面测试。
    
    ```
    #若要声明并调用浏览器
    from selenium import webdriver
    browser = webdriver.Chrome()或browser = webdriver.Firefox() --调用chrome或firefox，会自动打开浏览器
    --需要把Chromedriver加入到path，下载地址
    --http://chromedriver.storage.googleapis.com/index.html
    browser.get(url) -- 浏览器发送get请求
    print(browser.page_source)
    browser.close()---关闭浏览器
    ```
    
    ##### debug模式
    
    ```
    #先启动调试浏览器
    "C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
    #使用调试浏览器
    option=webdriver.ChromeOptions()
    option.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    browser=webdriver.Chrome(options=option)
    ```
    
    ##### 查找元素
    
    browser.get/post后，
    
    ```
    browser.find_element_by_id("q")      --通过id
    browser.find_element_by_css_selector("#q")--通过css选择权
    browser.find_element_by_xpath('//*[@id="q"]')--通过xpath
    ```
    
    一些常用查找元素的方法：
    
    ```
    find_element_by_name
    find_element_by_id
    find_element_by_xpath
    find_element_by_link_text
    find_element_by_partial_link_text
    find_element_by_tag_name
    find_element_by_class_name
    find_element_by_css_selector
    ```
    
    ##### 多元素查找
    
    把element改成elements即可
    
    ##### 元素交互操作
    
    根据查询到的元素及元素的交互操作，调用不同的方法
    
    ```
    input.send_keys("abc")---输入框中输入“abc”
    button.click()
    ```
    
    ##### 交互动作
    
    ```
    browser.switch_to.frame('iframeResult')--且换frame
    source=browser.find_element_by_css_selector('#draggable')--
    target=browser.find_element_by_css_selector('$droppable')
    actions = ActionChains(browser)
    actions.drag_and_drop(source,target)
    actions.perform()
    ```
    
    ##### 执行JavaScript
    
    ```
    browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
    browser.execute_script('alert("To Bottom")')
    ```
    
    ##### 获取元素属性
    
    ```
    logo = browser.find_element_by_id('zh-top-link-logo')
    print(logo.get_attribute('class'))
    
    input.text --获取文本值
    input.id
    input.location
    input.tag_name
    input.size
    ```
    
    ##### Frame
    
    很多网页中都有Frame标签，所以需要切入及切出frame
    
    常用：switch_to.frame()和switch_to.parent_frame()
    
    ##### 等待
    
    ###### 隐式等待
    
    当使用了隐式等待时，如果webdriver没有在dom中找到元素，将继续等待，超时后抛异常。默认隐式等待时间0
    
    当查找元素或元素并没有立即出现的时候，隐式等待将等待一段时间再查找 DOM
    
    ```
    broswer.implicitly_wait(10)--设置隐式等待时间
    ```
    
    ###### 显式等待
    
    指定等待条件，并设定最长等待时间。
    
    当查找元素或元素并没有立即出现的时候，显式等待将在此期间查找 DOM，如果找到元素就返回，否则等待至超时并抛出异常。
    
    ```
    
    ```
    
    ##### 常用判断条件
    
    ```
    title_is 标题是某内容
    title_contains 标题包含某内容
    presence_of_element_located 元素加载出，传入定位元组，如(By.ID, 'p')
    visibility_of_element_located 元素可见，传入定位元组
    visibility_of 可见，传入元素对象
    presence_of_all_elements_located 所有元素加载出
    text_to_be_present_in_element 某个元素文本包含某文字
    text_to_be_present_in_element_value 某个元素值包含某文字
    frame_to_be_available_and_switch_to_it frame加载并切换
    invisibility_of_element_located 元素不可见
    element_to_be_clickable 元素可点击
    staleness_of 判断一个元素是否仍在DOM，可判断页面是否已经刷新
    element_to_be_selected 元素可选择，传元素对象
    element_located_to_be_selected 元素可选择，传入定位元组
    element_selection_state_to_be 传入元素对象以及状态，相等返回True，否则返回False
    element_located_selection_state_to_be 传入定位元组以及状态，相等返回True，否则返回False
    alert_is_present 是否出现Alert
    ```
    
    ##### 浏览器前进和后退
    
    back()
    
    forward()
    
    ##### cookie操作
    
    get_cookies()
    
    delete_all_cookies()
    
    add_cookie()
    
    ##### 选项卡管理
    
    通过执行js命令window.open()新开选项卡
    
    不同的选项卡存在列表里browser.window_handles
    
    ##### 异常处理
    
    参考：<http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions>
    
    
*Write* `your` **Markdown** here.
  </textarea>
  <script>$m.innerHTML = marked.parse($t.value);</script>
</body>
</html>
